﻿#include "adsever.h"
#include "ui_adsever.h"
#pragma execution_character_set("utf-8")
AdSever::AdSever(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::AdSever)
{
    ui->setupUi(this);
    this->setWindowIcon(QIcon(":/server.webp"));
    ui->centralWidget->setLayout(ui->horizontalLayout_5);
    ui->horizontalLayout_5->setContentsMargins(5,5,5,5);

    date = new AdDate(ui->date_lb);//时间
    date->start();//更新时间

    tcpsever = new AdTcp(ui->client_lw);// 客户端列表（下位机）
    connect(tcpsever, SIGNAL(GUI_WarningSignal(QString,QString,QString,QString)), this, SLOT(GUI_WarningMsg(QString,QString,QString,QString)));

    msgList=new AdMsgList(ui->msg_lw);// 已经发送消息列表，实现右键复制

    {// 广告模块
        this->setAcceptDrops(true);//设置允许向窗口拖入图片
        ui->video_lb->setAlignment(Qt::AlignCenter);  //居中显示
        //自适应的label+pixmap充满窗口后，无法缩小只能放大
        ui->video_lb->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);// Ignored忽略
        //不显示行向滚动条，子项文本过长自动显示...
        ui->ad_lw->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

        num=0; //照片张数
        connect(ui->ad_lw,SIGNAL(clicked(const QModelIndex &)),this,SLOT(qListWidget_clicked(const QModelIndex &)));
        // 内容是否自动缩放，参数true自动缩放
        ui->video_lb->setScaledContents(true);//显示图片的全部

    }
}

AdSever::~AdSever()
{
    delete ui;
}

//拖进事件
void AdSever::dragEnterEvent(QDragEnterEvent *event)
{
    // 如果文件的后缀名是jpg、jpeg、bmp或png，则接受拖放事件，否则忽略拖放事件
    QStringList acceptedFileTypes;
    acceptedFileTypes.append("jpg");
    acceptedFileTypes.append("jpeg");
    acceptedFileTypes.append("bmp");
    acceptedFileTypes.append("png");
    // 用于检查拖放的数据是否包含URL,并且获取拖放事件中的URL数量==1
    if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1)
    {
        // 获取拖放事件中的第一个URL的本地文件路径
        QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
        // 检查文件的后缀名是否在接受的文件类型列表中;（获取文件的后缀名，并将其转换为小写字母）
        if(acceptedFileTypes.contains(file.suffix().toLower()))
        {
            event->acceptProposedAction();//表明用户可以在窗口部件上拖放对象[接受拖放事件的操作]
        }
    }
}

// 拖进放下事件
void AdSever::dropEvent(QDropEvent *event)
{
    // 获取拖放事件中的第一个URL的本地文件路径
    QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());

    qDebug()<<"绝对路径:"<<file.absoluteFilePath();
    //从文件中加载图片，参数file.absoluteFilePath()表示文件的绝对路径，load()返回一个bool值，表示是否加载成功
    if(pixmap.load(file.absoluteFilePath()))
    {
        // 将图片缩放到指定大小，参数ui->label->size()表示缩放的大小，Qt::KeepAspectRatio表示保持图片的宽高比，Qt::SmoothTransformation表示使用平滑缩放算法
        ui->video_lb->setPixmap(pixmap.scaled(ui->video_lb->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));

        ui->videoname_lb->setText(file.absolutePath());//显示打开的文件的绝对路径,这不包括文件名。
        photoPath.append(file.absoluteFilePath());// 把图片的路径装到容器中

        QListWidgetItem *item = new QListWidgetItem(QIcon(file.absoluteFilePath()),file.fileName());//建立文件缩小图标
        item->setToolTip(file.fileName());// tip提示
        item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置
        ui->ad_lw->addItem(item);//把图片相对路径显示到窗口中
    }else
    {
        // 错误消息框
        QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));
    }
}

//用于在窗口大小改变时处理事件
int i=0;
void AdSever::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);//忽略编译器发出的警告，表明变量event未使用
    qDebug()<<"窗口大小改变:"<<i++;
    if(!pixmap.isNull())
    {
        qDebug()<<"";
        ui->video_lb->setPixmap(pixmap.scaled(ui->video_lb->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    }
}

// 清空
void AdSever::on_clear_msg_bt_clicked()
{
    ui->msg_te->clear();
}

// 广播
void AdSever::on_broast_msg_bt_clicked()
{
    // 获取文本内容
    QString info = ui->msg_te->toPlainText();
    if(!info.isEmpty())// 是否空的
    {
        tcp_MSG msg={};
        msg.type=MsgType::MASSEGE;
        strcpy(msg.txt,info.toUtf8().data());// memcpy(msg.txt,info.toUtf8().data(),info.toUtf8().length());

        memset(msg.city,0,sizeof(msg.city));
        memset(msg.area,0,sizeof(msg.area));
        memset(msg.weather,0,sizeof(msg.weather));

        qDebug()<<"广播发送信息："<<info;
        tcpsever->broadcastMsg(msg);

        QListWidgetItem *item = new QListWidgetItem(QString(QTime::currentTime().toString("hh:mm:ss")+"\t"+info));
        item->setToolTip(info);// tip提示
        item->setTextAlignment(Qt::AlignLeft);//设置item项中的文字位置
        ui->msg_lw->addItem(item);

        ui->msg_te->clear();
    }
}

//设置地区
void AdSever::on_set_city_bt_clicked()
{
    if(ui->client_lw->selectedItems().isEmpty())
    {
        QMessageBox::warning(this,"提示","请选择下位机");
        return;
    }
    if(ui->city_cb->currentText().isEmpty()||ui->distict_cb->currentText().isEmpty())
    {
        QMessageBox::warning(this,"提示","请选择城市和地区");
        return;
    }
    // 获取文本内容
    QString city = ui->city_cb->currentText();
    QString area = ui->distict_cb->currentText();
    QString weather = ui->weather_lb->text();

    tcp_MSG msg={};
    msg.type=MsgType::WEATHER;

    memset(msg.txt,0,sizeof(msg.txt));

    strcpy(msg.city,city.toUtf8().data());
    strcpy(msg.area,area.toUtf8().data());
    strcpy(msg.weather,weather.toUtf8().data());

    qDebug()<<"发送天气";
    tcpsever->MultiSelectUnicastMsg(msg);

}

//设置警报
void AdSever::GUI_WarningMsg(QString title, QString text, QString buttons, QString defaultButton)
{
    Q_UNUSED(buttons)//忽略编译器发出的警告，表明变量event未使用
    Q_UNUSED(defaultButton)
    QMessageBox::warning(this,title,text);
    return;
}

// 添加广告
void AdSever::on_add_ad_bt_clicked()
{
    QFileDialog dialog(this);//文件选择窗口
    dialog.setNameFilter(tr("Images (*.jpg *.jpeg *.bmp *.png)"));// 过滤器
    dialog.setFileMode(QFileDialog::AnyFile);//设置文件模式(文件/文件夹)：任意文件，无论是否存在
    QStringList fileNames;
    if (dialog.exec())
        fileNames = dialog.selectedFiles();// 存所有选择的文件
    if(!fileNames.isEmpty())
    {
        if(pixmap.load(fileNames[0]))
        {
            qDebug()<<"文件名:"<<fileNames[0];
            ui->video_lb->setPixmap(pixmap.scaled(ui->video_lb->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));

            QFileInfo file(fileNames[0]);
            ui->videoname_lb->setText(file.absolutePath());//显示打开的文件的绝对路径,这不包括文件名。
            photoPath.append(file.absoluteFilePath());// 把图片的路径装到容器中
            QListWidgetItem *item = new QListWidgetItem(QIcon(file.absoluteFilePath()),file.fileName());//建立文件缩小图标
            item->setToolTip(file.fileName());// tip提示
            item->setTextAlignment(Qt::AlignCenter);//设置item项中的文字位置
            ui->ad_lw->addItem(item);//把图片相对路径显示到窗口中
        }
    }
}
// 删除广告
void AdSever::on_delete_ad_bt_clicked()
{
    int deleteNum = ui->ad_lw->row(ui->ad_lw->currentItem()); //获取当前点击的内容的行号
    if(deleteNum<0)
        return;
    QListWidgetItem *item=ui->ad_lw->takeItem(deleteNum);//删除该列表项
    delete item;//手工再释放该列表项占用的资源
    photoPath.takeAt(deleteNum);
    ui->video_lb->clear();
    qDebug()<<"删除图片:"<<deleteNum;
}

//广告列表点击
void AdSever::qListWidget_clicked(const QModelIndex &index)
{
    Q_UNUSED(index);//忽略编译器发出的警告，表明变量event未使用

    num = ui->ad_lw->row(ui->ad_lw->currentItem()); //获取当前点击的内容的行号
    qDebug()<<"点击播放图片:"<<num;
    QString tempDir;
    tempDir.clear();
    tempDir=photoPath.at(num); //从容器中找到要播放的照片的相对路径

    pixmap.load(tempDir);// 更新全局图片
    ui->video_lb->setPixmap(pixmap.scaled(ui->video_lb->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));//显示图片
}

// 发送添加
void AdSever::on_ad_sendAdd_bt_clicked()
{
    if(ui->client_lw->selectedItems().isEmpty())
    {
        QMessageBox::warning(this,"提示","请选择下位机");
        return;
    }
    if(ui->ad_lw->selectedItems().isEmpty())
    {
        QMessageBox::warning(this,"提示","请选择图片");
        return;
    }
    tcpsever->Ad_SendAction(MsgType::AD_add,photoPath.at(num),num,photoPath.count());
}

// 发送删除
void AdSever::on_ad_sendDelete_bt_clicked()
{
    if(ui->client_lw->selectedItems().isEmpty())
    {
        QMessageBox::warning(this,"提示","请选择下位机");
        return;
    }
    if(ui->ad_lw->selectedItems().isEmpty())
    {
        QMessageBox::warning(this,"提示","请选择图片");
        return;
    }

    tcpsever->Ad_SendAction(MsgType::AD_delete,photoPath.at(num),num,photoPath.count());
}

